home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Fixation 1.3 / window.c < prev    next >
Text File  |  1996-04-11  |  35KB  |  1,315 lines

  1. /*****
  2.  * myWindow.c
  3.  *
  4.  *
  5.  *****/
  6.  
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <ctype.h>
  10.  
  11. #include "mytypes.h"
  12. #include "error.h"
  13.  
  14. #include "fastmap.h"
  15. #include "graphics.h"
  16. #include "window.h"
  17. #include "main.h"
  18. #include "ResRefs.h"
  19. #include "util.h"
  20. #include "preffile.h"
  21. #include "outgoing.h"
  22. #include "globals.h"
  23. #include "game.h"
  24.  
  25. #include "tcpstuff.h"
  26.  
  27. enum {
  28.     kTypeHeight = 16
  29. };
  30.  
  31. typedef struct {
  32.     short itemType;
  33.     Handle item;
  34.     Rect box;
  35. } iteminfo;
  36.  
  37. #define kNumHistories 8
  38. #define kHistoryLength 256
  39.  
  40. char history[kNumHistories][kHistoryLength];
  41. short curhis = 0;
  42.  
  43. WindowPtr myWindow;            // addressWindow;
  44. TEHandle myText, typeText;
  45. ControlHandle gVBar;
  46. short gGameWindDepth;
  47.  
  48. Rect        dragRect;
  49. Rect        windowBounds = {50, 16, 340, 520};
  50. //Rect        gameWindowBounds = {40, 4, 40 + 300, 4 + kWinSize};
  51. //Rect        statusWindowBounds = {40, 16 + kWinSize, 140, 640 - 16};
  52. Rect        screenRect;
  53. int useColor = false;
  54. short gLinesInText;
  55.  
  56.     // it's an old way to do it, and though Apple doesn't promise to support it,
  57.     //        I bet they will
  58. static void CheckForColor()
  59. {
  60.     SysEnvRec se;
  61.     if (SysEnvirons(1, &se) == 0)
  62.         if (se.hasColorQD)
  63.                 useColor = true;
  64. }
  65.  
  66. short
  67. GetLineHeight(TEHandle tt)
  68. {
  69.     TextStyle tstyle;
  70.     short lineHeight, dd;
  71.     TEGetStyle(0, &tstyle, &lineHeight, &dd, tt);
  72.     return lineHeight;
  73. }
  74.  
  75.     // yes, very functional . . .
  76. void
  77. CalcVisLines(void)
  78. {
  79.     short height = (**myText).viewRect.bottom - (**myText).viewRect.top;
  80. //    gLinesInText = height / (**myText).lineHeight;
  81.     gLinesInText = height / GetLineHeight(myText);
  82. }
  83.  
  84. void CalcVBar(void)
  85. {
  86.     short old, ctlMax;
  87.     
  88.     ctlMax = (**myText).nLines - gLinesInText;
  89.     if (ctlMax < 0)
  90.         ctlMax = 0;
  91.     old = GetCtlMax(gVBar);
  92.     if (old != ctlMax) {
  93.         short val = GetCtlValue(gVBar);
  94.         if (val == old) {
  95.                 // they were at bottom we should scroll this joint
  96.             (**gVBar).contrlValue = ctlMax;        // illegal but twice as fast,
  97.                                                     // as not drawn twice
  98.             SetCtlMax(gVBar, ctlMax);
  99.             Adjust_text();
  100.         }
  101.         else {
  102.                 // they were elsewhere
  103.             SetCtlMax(gVBar, ctlMax);
  104.         }
  105. //        DrawControls(myWindow);
  106.     }
  107. }
  108.  
  109. /*
  110. static void
  111. LoadAddressDialog(void)
  112. {
  113.     addressWindow = (WindowPtr) GetNewDialog(rAddressDialog, 0, (WindowPtr) -1L);
  114.     verify(addressWindow);
  115. }
  116. */
  117.  
  118. void SetUpWindow(void)
  119. {
  120.     short i, type;
  121.     Rect box;
  122.  
  123.     dragRect = qd.screenBits.bounds;
  124.  
  125.     CheckForColor();
  126.     maindev = GetMainDevice();
  127.  
  128.         // set up text window
  129.     myWindow = (WindowPtr) NewCWindow(0L, &windowBounds, "\pFixation", false, documentProc, (WindowPtr) -1L, false, 0);
  130.     verify(myWindow);
  131.         // remember location of window from last time
  132.     if (!EmptyRect(&gPrefs.textWindPos)) {
  133.         MoveWindow(myWindow, gPrefs.textWindPos.left, gPrefs.textWindPos.top, false);
  134.         SizeWindow(myWindow, gPrefs.textWindPos.right - gPrefs.textWindPos.left, 
  135.                 gPrefs.textWindPos.bottom - gPrefs.textWindPos.top, false);
  136.     }
  137.     ShowWindow(myWindow);
  138.     SetPort(myWindow);
  139.     TextFont(gPrefs.currentFont);
  140.     TextSize(gPrefs.currentSize);
  141.     
  142.     box = myWindow->portRect;
  143.     InsetRect(&box, 4, 6);
  144.     box.right -= 16;        // for scroll bar
  145.     box.bottom -= kTypeHeight + 2;    // for other field
  146.         // make text field where one reads text
  147.     myText = TEStylNew(&box, &box);
  148. //    myText = TENew(&box, &box);
  149.     TEActivate(myText);
  150.     TEAutoView(false, myText);
  151.     CalcVisLines();
  152.     
  153.         // make text field where one types
  154.     TextFont(monaco);
  155.     TextSize(9);
  156.     box = myWindow->portRect;
  157.     box.top = box.bottom - kTypeHeight + 1;
  158.     InsetRect(&box, 4, 2);
  159.     box.right -= 16;
  160.     typeText = TENew(&box, &box);
  161.     TEActivate(typeText);
  162.     TEAutoView(true, typeText);
  163.  
  164.     box = myWindow->portRect;
  165.     SetRect(&box, box.right - 15, box.top - 1, box.right + 1, box.bottom + 2 - 16);
  166.     gVBar = NewControl(myWindow, &box, "\p", true, 0, 0, 0, 16, 0);
  167.     
  168.     TEFromScrap();
  169.  
  170. //    SelectWindow((WindowPtr) gameWindow);
  171.  
  172.     for (short nnn=0;nnn<kNumHistories;nnn++)
  173.         history[nnn][0] = 0;
  174.         
  175.     if ((**(*maindev)->gdPMap).pixelSize != 8)
  176.         tprintf("Fixation works more slowly when not in 256 colors.\r");
  177. }
  178.  
  179. void
  180. DrawTextWindow(void)
  181. {
  182.     EraseRect(&myWindow->portRect);
  183.     TEUpdate(&myWindow->portRect, myText);
  184.     TEUpdate(&myWindow->portRect, typeText);
  185.     DrawControls(myWindow);
  186. //    MoveTo(0, myWindow->portRect.bottom - kTypeHeight);
  187. //    Line(myWindow->portRect.right - 16, 0);
  188.     DrawGrowIcon(myWindow);
  189. }
  190.  
  191.  
  192.     // the foolish user thinks the window is the wrong size
  193. void
  194. GrowTextWindow(Point pt)
  195. {
  196.     Rect sr = { 80, 80, 1024, 1024 };
  197.     short oldh, oldv, dh, dv, newh, newv;
  198.     
  199.     SetPort(myWindow);
  200.  
  201.         // remember current size
  202.     oldh = myWindow->portRect.right; oldv = myWindow->portRect.bottom;
  203.     
  204.         // do the green thumb shit
  205.     long ret = GrowWindow(myWindow, pt, &sr);
  206.     
  207.     SizeWindow(myWindow, LoWord(ret), HiWord(ret), false);
  208.     newh = myWindow->portRect.right; newv = myWindow->portRect.bottom;
  209.     dh = newh - oldh; dv = newv - oldv;
  210.     
  211.     InvalRect(&myWindow->portRect);
  212.     
  213.         // adjust main text field
  214.     (**myText).destRect.right += dh; (**myText).destRect.bottom += dv;
  215.     (**myText).viewRect.right += dh; (**myText).viewRect.bottom += dv;
  216.     TECalText(myText);
  217.     CalcVisLines();
  218.     
  219.         // adjust text field where one types
  220.     Rect box = myWindow->portRect;
  221.     box.top = box.bottom - kTypeHeight + 1;
  222.     InsetRect(&box, 4, 2);
  223.     box.right -= 16;
  224.     (**typeText).destRect = box;
  225.     (**typeText).viewRect = box;
  226.     TECalText(typeText);
  227.     
  228.     SizeControl(gVBar, 16, newv - 13);
  229.     MoveControl(gVBar, newh - 15, -1);
  230.     CalcVBar();
  231. }
  232.  
  233. #define ran(x) (abs(Random()) % (x))
  234. #define flip (ran(2) == 0)
  235.  
  236. static void
  237. CoolPerson(char *s)
  238. {
  239.     if (flip)
  240.         switch(ran(4)) {
  241.             case 0: strcat(s, "phat "); break;
  242.             case 1: strcat(s, "straight "); break;
  243.             case 2: strcat(s, "funky "); break;
  244.             case 3: strcat(s, "mad "); break;
  245.         }
  246.     switch(ran(8)) {
  247.         case 0: strcat(s, "gangsta"); break;
  248.         case 1: strcat(s, "g"); break;
  249.         case 2: strcat(s, "home boy"); break;
  250.         case 3: strcat(s, "macker"); break;
  251.         case 4: strcat(s, "MC"); break;
  252.         case 5: strcat(s, "OG"); break;
  253.         case 6: strcat(s, "o-dog"); break;
  254.         case 7: strcat(s, "gangbanger"); break;
  255.     }
  256. }
  257.  
  258. static void
  259. Location(char *s)
  260. {
  261.     switch(ran(8)) {
  262.         case 0: strcat(s, "crib"); break;
  263.         case 1: strcat(s, "crypt"); break;
  264.         case 2: strcat(s, "hood"); break;
  265.         case 3: strcat(s, "gray goose"); break;
  266.         case 4: strcat(s, "morgue"); break;
  267.         case 5: strcat(s, "cell"); break;
  268.         case 6: strcat(s, "street"); break;
  269.         case 7: strcat(s, "LBC"); break;
  270.     }
  271. }
  272.  
  273. static void
  274. Activity(char *s)
  275. {
  276.     switch(ran(16)) {
  277.         case 0: strcat(s, "shootin' hoops"); break;
  278.         case 1: strcat(s, "mackin'"); break;
  279.         case 2: strcat(s, "knocking wood"); break;
  280.         case 3: case 12: strcat(s, "smoking ");
  281.             switch(ran(7)) {
  282.                 case 0: strcat(s, "Indo"); break;
  283.                 case 1: strcat(s, "blunts"); break;
  284.                 case 2: strcat(s, "crack"); break;
  285.                 case 3: strcat(s, "chronic"); break;
  286.                 case 4: strcat(s, "bubonic chronic"); break;
  287.                 case 5: strcat(s, "joints"); break;
  288.                 case 6: strcat(s, "hash"); break;
  289.             }
  290.             break;
  291.         case 4:
  292.             switch(ran(3)) {
  293.                 case 0: strcat(s, "sippin' "); break;
  294.                 case 1: strcat(s, "drinkin' "); break;
  295.                 case 2: strcat(s, "pounding "); break;
  296.             }
  297.             switch(ran(4)) {
  298.                 case 0: strcat(s, "40's"); break;
  299.                 case 1: strcat(s, "64's"); break;
  300.                 case 2: strcat(s, "King Cobra"); break;
  301.                 case 3: strcat(s, "Colt 45"); break;
  302.             }
  303.             break;
  304.         case 5: strcat(s, "bustin' moves"); break;
  305.         case 6: strcat(s, "trippin'"); break;
  306.         case 7: strcat(s, "takin' no shorts"); break;
  307.         case 8: strcat(s, "rolling with da crew"); break;
  308.         case 9: strcat(s, "chillin' in the crib"); break;
  309.         case 10: strcat(s, "cruising Crenshaw"); break;
  310.         case 11: strcat(s, "makin' deals"); break;
  311.         case 13: strcat(s, "rollin' in the el dog rag"); break;
  312.         case 14: case 15:
  313.             strcat(s, "packin' "); break;
  314.             switch(ran(4)) {
  315.                 case 0: strcat(s, "a gat "); break;
  316.                 case 1: strcat(s, "a nine "); break;
  317.                 case 2: strcat(s, "a glock "); break;
  318.                 case 3: strcat(s, "a duece duece "); break;
  319.             }
  320.             break;
  321.     }
  322. }
  323.  
  324. static short
  325. GreetingString(char *s)
  326. {
  327.     short len = strlen(s);
  328.     if (len < strlen("poopy x"))
  329.         return len;
  330.     strncpy(s, "xtell", 5);
  331.     
  332.     s[len++] = 0; s[len] = 0;
  333.     if (!isdigit(s[6])) {
  334.         strcat(&s[len], &s[6]);
  335.         s[len-1] = ' ';
  336.     }
  337.     else
  338.         s[0] = ' ';
  339.  
  340.     if (flip)
  341.         strcat(s, "dog");
  342.     strcat(s, " is in da house! ");
  343.     switch(ran(3)) {
  344.         case 0:
  345.             flip ? strcat(s, "Kickin' ") : strcat(s, "Kickin' ");
  346.             switch(ran(5)) {
  347.                 case 0: strcat(s, "it "); break;
  348.                 case 1: strcat(s, "the gangsta funk "); break;
  349.                 case 2: strcat(s, "g's "); break;
  350.                 case 3: strcat(s, "the industry "); break;
  351.                 case 4: strcat(s, "da sixty-fo squares "); break;
  352.             }
  353.             strcat(s, "for the ");
  354.             switch(ran(5)) {
  355.                 case 0: strcat(s, "nine point deuce "); break;
  356.                 case 1: strcat(s, "next millenium "); break;
  357.                 case 2: strcat(s, "hood rats "); break;
  358.                 case 3: strcat(s, "crack babies "); break;
  359.                 case 4: strcat(s, "phat crew "); break;
  360.             }
  361.             switch(ran(3)) {
  362.                 case 0: strcat(s, "to the max"); break;
  363.                 case 1: strcat(s, "you know what I'm sayin'"); break;
  364.                 case 2: strcat(s, "straight up"); break;
  365.             }
  366.             switch(ran(4)) {
  367.                 case 0: strcat(s, "! "); break;
  368.                 case 1: strcat(s, ", g! "); break;
  369.                 case 2: strcat(s, ", homie! "); break;
  370.                 case 3: strcat(s, ", homes! "); break;
  371.             }
  372.             break;
  373.         case 1:
  374.             switch(ran(3)) {
  375.                 case 0: strcat(s, "Tearin' up "); break;
  376.                 case 1: strcat(s, "Rippin' up "); break;
  377.                 case 2: strcat(s, "Busting up "); break;
  378.             }
  379.             switch(ran(6)) {
  380.                 case 0: strcat(s, "g's, "); break;
  381.                 case 1: strcat(s, "the crib, "); break;
  382.                 case 2: strcat(s, "da pad, "); break;
  383.                 case 3: strcat(s, "the house, "); break;
  384.                 case 4: strcat(s, "other rappers, "); break;
  385.                 case 5: strcat(s, "da industry, "); break;
  386.             }
  387.             Activity(s);
  388.             if (flip && flip) { // gafflin' props
  389.                 strcat(s, ", ");
  390.                 Activity(s);
  391.             }
  392.             strcat(s, "! ");
  393.             break;
  394.         case 2:
  395.             flip ? strcat(s, "He's da ") : strcat(s, "He's the ");
  396.             CoolPerson(s);
  397.             flip ? strcat(s, ", back from the ") : strcat(s, ", down from the ");
  398.             Location(s);
  399.             if (flip) {
  400.                 strcat(s, ", ");
  401.                 Activity(s);
  402.             }
  403.             strcat(s, "! ");
  404.             break;
  405.     }
  406.     
  407.     /*
  408.     nine double-m
  409. ak
  410. drop
  411. tip
  412. tokin' up
  413. one in the chamber
  414. peeled the cap
  415. hocus pocus
  416. 12 guage mossbird
  417. yo money
  418. impala
  419. macdaddy
  420. */
  421.  
  422.     switch (ran(13)) {
  423.         case 0: strcat(s, "Better step aside! "); break;
  424.         case 1: strcat(s, "No shorts! "); break;
  425.         case 2: strcat(s, "Wake your punk booty up! "); break;
  426.         case 3: strcat(s, "He gonna gaffle you! "); break;
  427.         case 4: strcat(s, "Gettin' mad props! "); break;
  428.         case 5: strcat(s, "Hittin' switches! "); break;
  429.         case 6: strcat(s, "Get the fou' one one! "); break;
  430.         case 7: strcat(s, "Time ta dial nine one one! "); break;
  431.         case 8: strcat(s, "He don't fall for the okey-doke! "); break;
  432.         case 9: strcat(s, "He'z all that and a pile of grits! "); break;
  433.         case 10: strcat(s, "You betta recognize! "); break;
  434.         case 11: strcat(s, "The leader of the number one crew in the area! "); break;
  435.         case 12: strcat(s, "Straight gangsta mack! "); break;
  436.     }
  437.  
  438.  
  439.     char *temp = &s[strlen(s)];
  440.     switch (ran(2)) {
  441.         case 0:
  442.             if (flip)
  443.                 strcat(s, "mackin', ");
  444.             if (flip) {
  445.                 if (flip) {
  446.                     if (flip) strcat(s, "phat ");
  447.                     strcat(s, "bowl ");
  448.                 }
  449.                 strcat(s, "packin', ");
  450.             }
  451.             if (flip) {
  452.                 if (flip) strcat(s, "straight ");
  453.                 else if (flip) strcat(s, "car ");
  454.                 strcat(s, "jackin', ");
  455.             }
  456.             if (flip)
  457.                 strcat(s, "hacking, ");
  458.             if (flip)
  459.                 strcat(s, "wack MC's smackin', ");
  460.             if (flip)
  461.                 strcat(s, "f-seven sacking, ");
  462.  
  463.             if (flip) {
  464.                 Activity(s);
  465.                 strcat(s, ", ");
  466.             }
  467.             switch(ran(4)) {
  468.                 case 0: strcat(s, "never lackin'! "); break;
  469.                 case 1: strcat(s, "no need to be askin'! "); break;
  470.                 case 2: strcat(s, "straight up straight down maxin'! "); break;
  471.                 case 3: strcat(s, "big deal backin'! "); break;
  472.             }
  473.             break;
  474.         case 1:
  475.             switch(ran(7)) {
  476.                 case 0: strcat(s, "They gonna "); break;
  477.                 case 1: strcat(s, "He makes other crews "); break;
  478.                 case 2: strcat(s, "Other crews just "); break;
  479.                 case 3: strcat(s, "Hood rats "); break;
  480.                 case 4: strcat(s, "Shorts takin' rappers "); break;
  481.                 case 5: strcat(s, "Grandmasterz gotta "); break;
  482.                 case 6: strcat(s, "Wack MC's "); break;
  483.             }
  484.             switch(ran(6)) {
  485.                 case 0: strcat(s, "stand aside "); break;
  486.                 case 1: strcat(s, "step back "); break;
  487.                 case 2: strcat(s, "back off "); break;
  488.                 case 3: strcat(s, "shrivel up "); break;
  489.                 case 4: strcat(s, "disappear "); break;
  490.                 case 5: strcat(s, "pay respect "); break;
  491.             }
  492.             switch(ran(5)) {
  493.                 case 0: strcat(s, "wanna die, "); break;
  494.                 case 1: strcat(s, "hear their sighs, "); break;
  495.                 case 2: strcat(s, "make their goodbyes, "); break;
  496.                 case 3: strcat(s, "ask if ya want fries, "); break;
  497.                 case 4: strcat(s, "no surprise, "); break;
  498.             }
  499.             if (flip)
  500.                 switch(ran(5)) {
  501.                     case 0: strcat(s, "wanna know why?, "); break;
  502.                     case 1: strcat(s, "know why?, "); break;
  503.                     case 2: strcat(s, "makes me cry, "); break;
  504.                     case 3: strcat(s, "phat 'n sly, "); break;
  505.                     case 4: strcat(s, "growin' banzais, "); break;
  506.                 }
  507.             switch(ran(5)) {
  508.                 case 0: strcat(s, "he steps up no trippin' ");
  509.                         if (flip) strcat(s, "no slippin' ");
  510.                         break;
  511.                 case 1: strcat(s, "he pops a cap "); break;
  512.                 case 2: strcat(s, "he packs his gat "); break;
  513.                 case 3: strcat(s, "he shows his face "); break;
  514.                 case 4: strcat(s, "lays a trap "); break;
  515.             }
  516.             switch(ran(5)) {
  517.                 case 0: strcat(s, "and they sizzel before your eyes! "); break;
  518.                 case 1: strcat(s, "and busts their lies! "); break;
  519.                 case 2: strcat(s, "and smacks the spies! "); break;
  520.                 case 3: strcat(s, "and hears their cries! "); break;
  521.                 case 4: strcat(s, "and flies! "); break;
  522.             }
  523.             break;
  524.     }
  525.     *temp = toupper(*temp);
  526.     
  527.     len = strlen(s);
  528.     
  529.     return len;
  530. }
  531.  
  532.     // called when the luser hits return in the type field
  533. void
  534. EnteredText(void)
  535. {
  536.     long nnn, len;
  537.     Handle hand = (**typeText).hText;
  538.     
  539.     len = (**typeText).teLength;
  540. //    if (len == 0)
  541. //        return;        // they opened their mouth, but no words came out . . .
  542.     
  543.     if (len > kGScratchSize - 1) len = kGScratchSize - 1;
  544.         // copy text in
  545.     for (nnn=0;nnn<len;nnn++)
  546.         gScratch[nnn] = ((unsigned char *) (*hand))[nnn];
  547.         
  548.         // history stuff
  549.     if (len > 0) {
  550.         strncpy(history[0], (char *) gScratch, kHistoryLength-1);
  551.         history[0][kHistoryLength-1] = 0;
  552.         if (len < kHistoryLength)
  553.             history[0][len] = 0;
  554.             // copy 'em downwards
  555.         for (nnn=kNumHistories-1;nnn>0;nnn--)
  556.             strcpy(history[nnn], history[nnn-1]);
  557.     }
  558.     curhis = 0;
  559.         
  560.         // a little easter egg
  561.     gScratch[len] = 0;
  562.     if (!strncmp((char *) gScratch, "poopy ", strlen("poopy ")))
  563.         len = GreetingString((char *) gScratch);
  564.  
  565.     gScratch[len++] = '\n';
  566.     gScratch[len++] = 0;
  567.         
  568.         // see if we should send this to our server
  569.     if (nexStatus[0] == kStatOpen) {
  570.         bprintf("%s", (char *) gScratch);
  571.     }
  572.  
  573.         // now we erase text
  574.     TESetText((Ptr) gScratch, 0, typeText);
  575.     SetPort(myWindow);
  576.     EraseRect(&(**typeText).viewRect);
  577.     
  578.         // output what we typed into myText field
  579.     gScratch[len-2] = '\r';
  580.     tprintf("%s", (char *) gScratch);
  581.     
  582.         // a little easter egg
  583.     if (!strncmp((char *) gScratch, "match adum", strlen("match adum")))
  584.         tprintf("It would be a match made in heaven . . . \r");
  585. }
  586.  
  587. void
  588. HandleKey(char c)
  589. {
  590.     long nnn, len;
  591.     Handle hand = (**typeText).hText;
  592.     
  593.     if (c >= 0x80 || c < 0)
  594.         return;        // these keys mess FICS up with Timeseal active
  595.     
  596. //    tprintf("%d ", c);
  597.     len = (**typeText).teLength;
  598.     if (len > kHistoryLength - 1) len = kHistoryLength - 1;
  599.  
  600.     if (c == 27) {
  601.         DoEscapeKey();
  602.     }
  603.     else if (c == 30) {        // up arrow
  604.         if (curhis == kNumHistories - 1)
  605.             return;
  606.         if (history[curhis+1][0] == 0)
  607.             return;        // don't go back that far
  608.         if (curhis == 0) {
  609.                 // copy text in
  610.             for (nnn=0;nnn<len;nnn++)
  611.                 history[0][nnn] = ((unsigned char *) (*hand))[nnn];
  612.             history[0][nnn] = 0;
  613.         }
  614.         curhis++;
  615.         TESetText((Ptr) history[curhis], strlen(history[curhis]), typeText);
  616.         SetPort(myWindow);
  617.         InvalRect(&(**typeText).viewRect);
  618.     }
  619.     else if (c == 31) {        // down arrow
  620.         if (curhis == 0)
  621.             return;
  622.         curhis--;
  623.         TESetText((Ptr) history[curhis], strlen(history[curhis]), typeText);
  624.         SetPort(myWindow);
  625.         InvalRect(&(**typeText).viewRect);
  626.     }
  627.     else
  628.         TEKey(c, typeText);
  629. }
  630.  
  631. static void QuickMouseDown (EventRecord    *theEvent)
  632. {
  633.     WindowPtr theWindow;
  634.     int windowCode = FindWindow (theEvent->where, &theWindow);
  635.     
  636.     switch (windowCode)
  637.     {
  638.         case inSysWindow: 
  639.             SystemClick (theEvent, theWindow);
  640.             break;
  641.         
  642.         case inDrag:
  643.             DragWindow(theWindow, theEvent->where, &dragRect);
  644.             break;    
  645.     }
  646. }
  647.  
  648. Boolean
  649. GetAnAddress(char *name, char *password, char *address, long *port)
  650. {
  651.         // items in dialog
  652.     enum {
  653.         pOkay = 1,
  654.         pCancel,
  655.         pName,
  656.         pPassword,
  657.         pIP,
  658.         pPort,
  659.         pShortcut,
  660.         pNotImportant1,
  661.         pNotImportant2,
  662.         pNotImportant3,
  663.         pNotImportant4,
  664.         pOpenButt,
  665.         pAddButt,
  666.         pRemoveButt,
  667.         pNotImportant5,
  668.         pNotImportant6,
  669.         pFics,
  670.         pIcc,
  671.         pTimeseal,
  672.         kFutzer,
  673.         kNumItems = kFutzer - 1
  674.     };
  675.  
  676.     Boolean okayed = false;
  677.     Str255 s;
  678.     iteminfo ilist[kNumItems+1];
  679.     short i, hitItem = -1;
  680.     WindowPtr saveport;
  681.     long reg, rep;
  682.     DialogPtr dialog;
  683.     DialogPeek dpeek;
  684.     OSErr err;
  685.     Rect box = {1000, 1000, 1010, 1010};
  686.     
  687.     TEHandle fake = TENew(&box, &box);
  688.     verify(fake);
  689.     
  690.     dialog = GetNewDialog(rAddressDialog, nil, (WindowPtr) -1L);
  691.     verify(dialog);
  692.     dpeek = (DialogPeek) dialog;
  693.     
  694. //    err = SetDialogDefaultItem(dialog, pOkay);
  695. //    err = SetDialogCancelItem(dialog, pCancel);
  696.  
  697.     ShowWindow(dialog);
  698.     SetPort(dialog);
  699.     for (i=1;i<=kNumItems;i++) {
  700.         ilist[i].item = 0;
  701.         GetDItem(dialog, i, &ilist[i].itemType, &ilist[i].item, &ilist[i].box);
  702.         verify(ilist[i].item);
  703.     }
  704.     NumToString(*port, s); SetIText(ilist[pPort].item, s);
  705.     
  706.         // now set the text for the IP field
  707.     for (i=0;address[i];i++)
  708.         s[i+1] = address[i];
  709.     s[0] = i;
  710.     SetIText(ilist[pIP].item, s);
  711.  
  712.         // now set the text for the name field
  713.     for (i=0;name[i];i++)
  714.         s[i+1] = name[i];
  715.     s[0] = i;
  716.     SetIText(ilist[pName].item, s);
  717.  
  718.         // now set the text for the password field
  719.     TESetText(password, strlen(password), fake);
  720.     for (i=0;password[i];i++)
  721.         s[i+1] = '•';
  722.     s[0] = i;
  723.     SetIText(ilist[pPassword].item, s);
  724.  
  725. //    SetCtlValue((ControlHandle) ilist[pFics].item, 1);
  726. //    HiliteControl((ControlHandle) ilist[pTimeseal].item, 255);
  727.  
  728.     SetCtlValue((ControlHandle) ilist[pFics].item, gPrefs.serverType == kFics);
  729.     SetCtlValue((ControlHandle) ilist[pIcc].item, gPrefs.serverType == kIcc);
  730.  
  731.     SetCtlValue((ControlHandle) ilist[pTimeseal].item, gPrefs.timeseal);
  732. //    VDebugStr("%d", gPrefs.timeseal);
  733.     
  734.         // set up list of shortcuts
  735.     Rect dataBounds = {0, 0, 0, 1}, slistRect;
  736.     Point cSize = {0, 0};
  737.     Cell cell;
  738.     ListHandle slist;
  739.     
  740.     SetRect(&slistRect, ilist[pOpenButt].box.left, ilist[pOpenButt].box.bottom + 8, 
  741.             ilist[pRemoveButt].box.right - 16, ilist[pOkay].box.bottom);
  742.     slist = LNew(&slistRect, &dataBounds, cSize, 0,
  743.             (WindowPtr) dialog, true, false, false, true);
  744.     verify(slist);
  745.     
  746.         // add cells
  747.     short loop;
  748.     cell.h = 0;
  749.         // add 'em all at once
  750.     for (loop=0;loop<kShortcuts;loop++)
  751.         if (!gShortcuts[loop].jexiste)
  752.             if (loop > 0) {
  753.                 LAddRow(loop, 32000, slist);
  754.                 break;
  755.             }
  756.     for (loop=0;loop<kShortcuts;loop++)
  757.         if (gShortcuts[loop].jexiste) {
  758.             cell.v = loop;
  759.             LSetCell((Ptr) gShortcuts[loop].shortcut, strlen(gShortcuts[loop].shortcut), cell, slist);
  760.         }
  761.  
  762.     int            ok;
  763.     EventRecord    theEvent;
  764.     DialogPtr dp;
  765.     char c;
  766.  
  767.     do {
  768. //        ModalDialog(nil, &hitItem);
  769.         ok = GetNextEvent (everyEvent, &theEvent);
  770.         if (theEvent.what == keyDown || theEvent.what == autoKey)
  771.             c = (theEvent.message & charCodeMask);
  772.         
  773.             // do own event handling
  774.         WindowPtr theWindow;    
  775.         switch (theEvent.what) {
  776.             case mouseDown:
  777.                 Point pt = theEvent.where;
  778.                 SetPort(dialog);
  779.                 GlobalToLocal(&pt);
  780.                 if (LClick(pt, 0, slist)) {
  781.                     Cell cell = LLastClick(slist);
  782.                     if (cell.v < 0)
  783.                         break;
  784.  
  785.                         // take the shortcut from our memory
  786.                     Shortcut *sc = &gShortcuts[cell.v];
  787.                     verify(sc->jexiste);
  788.  
  789.                     strcpy((char *) &s[1], sc->shortcut); s[0] = strlen(sc->shortcut);
  790.                     
  791.                     SetIText(ilist[pShortcut].item, s);
  792.  
  793.                     NumToString(gShortcuts[cell.v].port, s);
  794.                     SetIText(ilist[pPort].item, s);
  795.  
  796.                     strcpy((char *) &s[1], sc->name); s[0] = strlen(sc->name);
  797.                     SetIText(ilist[pName].item, s);
  798.  
  799.                     strcpy((char *) &s[1], sc->serverAddress); s[0] = strlen(sc->serverAddress);
  800.                     SetIText(ilist[pIP].item, s);
  801.  
  802.                     TESetText(sc->password, strlen(sc->password), fake);
  803.                     for (i=0;sc->password[i];i++)
  804.                         s[i+1] = '•';
  805.                     s[0] = i;
  806.                 //    strcpy((char *) &s[1], sc->password); s[0] = strlen(sc->password);
  807.                     SetIText(ilist[pPassword].item, s);
  808.  
  809.                     gPrefs.serverType = sc->serverType;
  810.                     gPrefs.timeseal = sc->timeseal;
  811.                     SetCtlValue((ControlHandle) ilist[pFics].item, sc->serverType == kFics);
  812.                     SetCtlValue((ControlHandle) ilist[pIcc].item, sc->serverType == kIcc);
  813.                     SetCtlValue((ControlHandle) ilist[pTimeseal].item, sc->timeseal);
  814.                 }
  815.                 QuickMouseDown(&theEvent);
  816.                 break;
  817.             case updateEvt:
  818.                 theWindow = (WindowPtr) theEvent.message;
  819.                 if (theWindow == dialog) {
  820.                     SetPort(theWindow);
  821.     
  822.                     Rect r = slistRect;
  823.                     InsetRect(&r, -1, -1);
  824.                     FrameRect(&r);
  825.                     LUpdate(theWindow->visRgn, slist);
  826.     
  827.                 }
  828.                 break;
  829.             case keyDown: case autoKey:
  830.                 if (((theEvent.modifiers & cmdKey) == 0) && dpeek->editField == pPassword - 1)
  831.                     if (c != '\t' && c != '\r' && c != '\n') {
  832.                         (**fake).selStart = (**(dpeek->textH)).selStart;
  833.                         (**fake).selEnd = (**(dpeek->textH)).selEnd;
  834.                         TEKey(c, fake);
  835.                             // hide password
  836.                         if (c != '\b' && c != 28 && c != 29 && c != 30 && c != 31) {
  837.                             theEvent.message -= theEvent.message & charCodeMask;
  838.                             theEvent.message += '•';
  839.                         }
  840.                     }
  841.                 break;
  842.             default:
  843.                 break;
  844.         }
  845.             
  846.         if (theEvent.what == keyDown && ((theEvent.modifiers & cmdKey) != 0)
  847.             && c == '.')
  848.             hitItem = pCancel;
  849.         else if (theEvent.what == keyDown && c == '\r')
  850.             hitItem = pOkay;
  851.         else if (IsDialogEvent(&theEvent))
  852.             if (DialogSelect(&theEvent, &dp, &hitItem)) {
  853.                 switch (hitItem) {
  854.                     case pOkay:        // check values, make sure they're okay
  855.                         GetIText(ilist[pName].item, s);
  856.                         if (s[0] == 0) { hitItem = -1; break; }
  857.                         GetIText(ilist[pIP].item, s);
  858.                         if (s[0] == 0) { hitItem = -1; break; }
  859.                         GetIText(ilist[pPort].item, s);
  860.                         if (s[0] == 0) { hitItem = -1; break; }
  861.                         break;
  862.                     case pAddButt: {
  863.                             Cell cell = {0, 0};
  864.                             GetIText(ilist[pShortcut].item, s);
  865.                             if (s[0] == 0) {
  866.                                 stdmessage("\pPlease name your shortcut before adding it.");
  867.                                 SetPort(dialog);
  868.                                 break;
  869.                             }
  870.                             if (gShortcuts[kShortcuts-1].jexiste) {
  871.                                 stdmessage("\pI'm sorry, no more shortcuts can be added.  How many servers can there be, for heaven's sake?");
  872.                                 SetPort(dialog);
  873.                                 break;
  874.                             }
  875.                             cell.v = LAddRow(1, 32000, slist);
  876.                             LSetCell((Ptr) &(s[1]), s[0], cell, slist);
  877.                             verify(gShortcuts[cell.v].jexiste == false);
  878.                                 // add the shortcut to our memory
  879.                             Shortcut *sc = &gShortcuts[cell.v];
  880.                             sc->jexiste = true;
  881.  
  882.                             strncpy(sc->shortcut, (char *) &s[1], kPlayerNameLength-1);
  883.                             if (s[0] < kPlayerNameLength) sc->shortcut[s[0]] = 0;
  884.  
  885.                             GetIText(ilist[pPort].item, s);
  886.                             StringToNum(s, &gShortcuts[cell.v].port);
  887.  
  888.                             GetIText(ilist[pName].item, s);
  889.                             strncpy(sc->name, (char *) &s[1], kPlayerNameLength - 1);
  890.                             if (s[0] < kPlayerNameLength) sc->name[s[0]] = 0;
  891.  
  892.                             GetIText(ilist[pIP].item, s);
  893.                             strncpy(sc->serverAddress, (char *) &s[1], kPlayerNameLength - 1);
  894.                             if (s[0] < kPlayerNameLength) sc->serverAddress[s[0]] = 0;
  895.  
  896.                     //        GetIText(ilist[pPassword].item, s);
  897.                     //        strncpy(sc->password, (char *) &s[1], kPlayerNameLength - 1);
  898.                     //        if (s[0] < kPlayerNameLength) sc->password[s[0]] = 0;
  899.                                 // copy in from fake text field
  900.                             short tlen = kPlayerNameLength - 1;
  901.                             if ((**fake).teLength < tlen)
  902.                                 tlen = (**fake).teLength;
  903.                             for (short blah = 0; blah < tlen; blah++)
  904.                                 sc->password[blah] = ((char *) (*((**fake).hText)))[blah];
  905.                             sc->password[tlen] = 0;
  906.  
  907.                             short val;
  908.                             val = GetCtlValue((ControlHandle) ilist[pFics].item);
  909.                             sc->serverType = !val;
  910.                             val = GetCtlValue((ControlHandle) ilist[pTimeseal].item);
  911.                             sc->timeseal = val;
  912.  
  913.                             sc->shortcut[kPlayerNameLength-1] = 0;
  914.                             sc->name[kPlayerNameLength-1] = 0;
  915.                             sc->serverAddress[kPlayerNameLength-1] = 0;
  916.                             sc->password[kPlayerNameLength-1] = 0;
  917.                         }
  918.                         break;
  919.                     case pRemoveButt: {
  920.                             Cell cell = {0, 0};
  921.                             if (LGetSelect(true, &cell, slist))
  922.                                 LDelRow(1, cell.v, slist);
  923.  
  924.                                 // erase internal representation
  925.                             short nnn;
  926.                             for (nnn=cell.v; nnn<kShortcuts - 1; nnn++)
  927.                                 memcpy(&gShortcuts[nnn], &gShortcuts[nnn+1], sizeof(Shortcut));
  928.                             gShortcuts[kShortcuts-1].jexiste = false;
  929.                         }
  930.                         break;
  931.                     case pOpenButt: {
  932.                             Cell cell = LLastClick(slist);
  933.  
  934.                             if (!LGetSelect(true, &cell, slist))
  935.                                 break;
  936.         
  937.                                 // take the shortcut from our memory
  938.                             Shortcut *sc = &gShortcuts[cell.v];
  939.                             verify(sc->jexiste);
  940.         
  941.                             strcpy((char *) &s[1], sc->shortcut); s[0] = strlen(sc->shortcut);
  942.                             
  943.                             SetIText(ilist[pShortcut].item, s);
  944.         
  945.                             NumToString(gShortcuts[cell.v].port, s);
  946.                             SetIText(ilist[pPort].item, s);
  947.         
  948.                             strcpy((char *) &s[1], sc->name); s[0] = strlen(sc->name);
  949.                             SetIText(ilist[pName].item, s);
  950.         
  951.                             strcpy((char *) &s[1], sc->serverAddress); s[0] = strlen(sc->serverAddress);
  952.                             SetIText(ilist[pIP].item, s);
  953.         
  954.                             TESetText(sc->password, strlen(sc->password), fake);
  955.                             for (i=0;sc->password[i];i++)
  956.                                 s[i+1] = '•';
  957.                             s[0] = i;
  958.                             SetIText(ilist[pPassword].item, s);
  959.         
  960.                             gPrefs.serverType = sc->serverType;
  961.                             gPrefs.timeseal = sc->timeseal;
  962.                             SetCtlValue((ControlHandle) ilist[pFics].item, sc->serverType == kFics);
  963.                             SetCtlValue((ControlHandle) ilist[pIcc].item, sc->serverType == kIcc);
  964.                             SetCtlValue((ControlHandle) ilist[pTimeseal].item, sc->timeseal);
  965.                         }
  966.                         break;
  967.                     case pFics: case pIcc:
  968.                         gPrefs.serverType = hitItem - pFics;
  969.                         SetCtlValue((ControlHandle) ilist[pFics].item, gPrefs.serverType == kFics);
  970.                         SetCtlValue((ControlHandle) ilist[pIcc].item, gPrefs.serverType == kIcc);
  971.                         break;
  972.                     case pTimeseal:
  973.                         gPrefs.timeseal ^= 1;
  974.                         SetCtlValue((ControlHandle) ilist[pTimeseal].item, gPrefs.timeseal);
  975.                         break;
  976.                     default: break;
  977.                 }
  978.                 if (hitItem == -1)
  979.                     stdmessage("\pPlease fill in all fields (password optional).");
  980.         }
  981.     } while ((hitItem != pOkay) && (hitItem != pCancel));
  982.     
  983.     okayed = hitItem == pOkay;
  984.     
  985.     if (okayed) {        // change real values
  986.         GetIText(ilist[pPort].item, s); StringToNum(s, port);
  987.         
  988.         GetIText(ilist[pIP].item, s);
  989.         for (i=1;i<=s[0];i++)
  990.             address[i-1] = s[i];
  991.         address[i-1] = 0;
  992.         
  993.         GetIText(ilist[pName].item, s);
  994.         for (i=1;i<=s[0];i++)
  995.             name[i-1] = s[i];
  996.         name[i-1] = 0;
  997.         
  998.     //    GetIText(ilist[pPassword].item, s);
  999.     //    for (i=1;i<=s[0];i++)
  1000.     //        password[i-1] = s[i];
  1001.     //    password[i-1] = 0;
  1002.  
  1003.         short tlen = kPlayerNameLength - 1;
  1004.         if ((**fake).teLength < tlen)
  1005.             tlen = (**fake).teLength;
  1006.         for (short blah = 0; blah < tlen; blah++)
  1007.             password[blah] = ((char *) (*((**fake).hText)))[blah];
  1008.         password[tlen] = 0;        
  1009.     }
  1010.     
  1011. //    HideWindow(addressWindow);
  1012.     TEDispose(fake);
  1013.     DisposDialog(dialog);        // we Audi 5000, g
  1014.     return okayed;
  1015. }
  1016.  
  1017. void
  1018. PrefDialog(void)
  1019. {
  1020.         // items in dialog
  1021.     enum {
  1022.         pOkay = 1,
  1023.         pCancel,
  1024.         pAutoBug,
  1025.         pWhite,
  1026.         pBlack,
  1027.         pAutoFlip,
  1028.         pSmartClose,
  1029.         pTrueColors,
  1030.         pPieces,
  1031.         pPieces2,
  1032.         pPieces3,
  1033.         pPieces4,
  1034.         pChannelColors = 19,
  1035.         pAdminColors,
  1036.         pSmartText,
  1037.         pSlowText,
  1038.         pMinimal,
  1039.         kFutzer,
  1040.         kNumItems = kFutzer - 1,
  1041.         kNumPieces = 2
  1042.     };
  1043.  
  1044.     Boolean okayed = false;
  1045.     Str255 s;
  1046.     iteminfo ilist[kNumItems+1];
  1047.     short i, hitItem = -1;
  1048.     WindowPtr saveport;
  1049.     long reg, rep;
  1050.     DialogPtr dialog;
  1051.     OSErr err;
  1052.     prefStruct oldprefs = gPrefs;
  1053.         
  1054.     dialog = GetNewDialog(rPrefsDialog, nil, (WindowPtr) -1L);
  1055.     verify(dialog);
  1056.     
  1057. //    err = SetDialogDefaultItem(dialog, pOkay);
  1058. //    err = SetDialogCancelItem(dialog, pCancel);
  1059.  
  1060.     ShowWindow(dialog);
  1061.     SetPort(dialog);
  1062.     for (i=1;i<=kNumItems;i++) {
  1063.         ilist[i].item = 0;
  1064.         GetDItem(dialog, i, &ilist[i].itemType, &ilist[i].item, &ilist[i].box);
  1065.         verify(ilist[i].item);
  1066.     }
  1067.  
  1068.     SetCtlValue((ControlHandle) ilist[pAutoFlip].item, gPrefs.autoFlip);
  1069.     SetCtlValue((ControlHandle) ilist[pSmartClose].item, gPrefs.smartClose);
  1070.     SetCtlValue((ControlHandle) ilist[pAutoBug].item, gPrefs.autoBug);
  1071.     SetCtlValue((ControlHandle) ilist[pTrueColors].item, gPrefs.trueColors);
  1072.     SetCtlValue((ControlHandle) ilist[pPieces + gPrefs.pieceSet].item, 1);
  1073.     SetCtlValue((ControlHandle) ilist[pChannelColors].item, gPrefs.channelColors);
  1074.     SetCtlValue((ControlHandle) ilist[pAdminColors].item, gPrefs.adminColors);
  1075.     SetCtlValue((ControlHandle) ilist[pSmartText].item, gPrefs.smartText);
  1076.     SetCtlValue((ControlHandle) ilist[pSlowText].item, gPrefs.slowText);
  1077.     SetCtlValue((ControlHandle) ilist[pMinimal].item, gPrefs.minimal);
  1078.  
  1079.     int            ok;
  1080.     EventRecord    theEvent, eve;
  1081.     DialogPtr dp;
  1082.     char c;
  1083.     Rect r1 = ilist[pWhite].box;
  1084.     r1.left = r1.right + 16;
  1085.     r1.right = r1.left + 48;
  1086.     InsetRect(&r1, 0, -2);
  1087.     Rect r2 = ilist[pBlack].box;
  1088.     r2.left = r2.right + 16;
  1089.     r2.right = r2.left + 48;
  1090.     InsetRect(&r2, 0, -2);
  1091.  
  1092.     do {
  1093.         ok = GetNextEvent (everyEvent, &theEvent);
  1094.         if (!ok)
  1095.             continue;
  1096.         if (theEvent.what == keyDown)
  1097.             c = (theEvent.message & charCodeMask);
  1098.         eve = theEvent;
  1099.             
  1100.         if (theEvent.what == updateEvt) {
  1101.             SetPort(dialog);
  1102.             
  1103.             RGBForeColor(&gPrefs.colWhite);
  1104.             PaintRect(&r1);
  1105.  
  1106.             RGBForeColor(&gPrefs.colBlack);
  1107.             PaintRect(&r2);
  1108.  
  1109.             RGBForeColor(&rgbBlack);
  1110.         }
  1111.         
  1112.         hitItem = -1;
  1113.         if (theEvent.what == keyDown && ((theEvent.modifiers & cmdKey) != 0)
  1114.             && c == '.')
  1115.             hitItem = pCancel;
  1116.         else if (theEvent.what == keyDown && c == '\r')
  1117.             hitItem = pOkay;
  1118.         else if (IsDialogEvent(&theEvent))
  1119.             if (DialogSelect(&theEvent, &dp, &hitItem)) {
  1120.                 switch (hitItem) {
  1121.                     default: break;
  1122.                 }
  1123.             }
  1124.             
  1125.         switch (hitItem) {
  1126.             case pBlack: {
  1127.                     Point pt = {0, 0};
  1128.                     if (GetColor(pt, "\pSet black square color", &gPrefs.colBlack, &gPrefs.colBlack)) {
  1129.                         SetPort(dialog);
  1130.                         RGBForeColor(&gPrefs.colBlack);
  1131.                         PaintRect(&r2);    
  1132.                         RGBForeColor(&rgbBlack);
  1133.                     }
  1134.                 }
  1135.                 break;
  1136.             case pWhite: {
  1137.                     Point pt = {0, 0};
  1138.                     if (GetColor(pt, "\pSet white square color", &gPrefs.colWhite, &gPrefs.colWhite)) {
  1139.                         SetPort(dialog);
  1140.                         RGBForeColor(&gPrefs.colWhite);
  1141.                         PaintRect(&r1);    
  1142.                         RGBForeColor(&rgbBlack);
  1143.                     }
  1144.                 }
  1145.                 break;
  1146.             case pSmartClose:
  1147.                 gPrefs.smartClose = !gPrefs.smartClose;
  1148.                 SetCtlValue((ControlHandle) ilist[pSmartClose].item, gPrefs.smartClose);
  1149.                 break;
  1150.             case pAutoBug:
  1151.                 gPrefs.autoBug = !gPrefs.autoBug;
  1152.                 SetCtlValue((ControlHandle) ilist[pAutoBug].item, gPrefs.autoBug);
  1153.                 break;
  1154.             case pAutoFlip:
  1155.                 gPrefs.autoFlip = !gPrefs.autoFlip;
  1156.                 SetCtlValue((ControlHandle) ilist[pAutoFlip].item, gPrefs.autoFlip);
  1157.                 break;
  1158.             case pTrueColors:
  1159.                 gPrefs.trueColors = !gPrefs.trueColors;
  1160.                 SetCtlValue((ControlHandle) ilist[pTrueColors].item, gPrefs.trueColors);
  1161.                 break;
  1162.             case pChannelColors:
  1163.                 gPrefs.channelColors = !gPrefs.channelColors;
  1164.                 SetCtlValue((ControlHandle) ilist[pChannelColors].item, gPrefs.channelColors);
  1165.                 break;
  1166.             case pAdminColors:
  1167.                 gPrefs.adminColors = !gPrefs.adminColors;
  1168.                 SetCtlValue((ControlHandle) ilist[pAdminColors].item, gPrefs.adminColors);
  1169.                 break;
  1170.             case pSmartText:
  1171.                 gPrefs.smartText = !gPrefs.smartText;
  1172.                 SetCtlValue((ControlHandle) ilist[pSmartText].item, gPrefs.smartText);
  1173.                 break;
  1174.             case pSlowText:
  1175.                 gPrefs.slowText = !gPrefs.slowText;
  1176.                 SetCtlValue((ControlHandle) ilist[pSlowText].item, gPrefs.slowText);
  1177.                 break;
  1178.             case pMinimal:
  1179.                 gPrefs.minimal = !gPrefs.minimal;
  1180.                 SetCtlValue((ControlHandle) ilist[pMinimal].item, gPrefs.minimal);
  1181.                 break;
  1182.             case pPieces: case pPieces2: case pPieces3: case pPieces4:
  1183.                 short np = hitItem - pPieces;
  1184.                 if (np != gPrefs.pieceSet) {
  1185.                     SetCtlValue((ControlHandle) ilist[pPieces+gPrefs.pieceSet].item, 0);
  1186.                     SetCtlValue((ControlHandle) ilist[pPieces+np].item, 1);
  1187.                     gPrefs.pieceSet = np;
  1188.                 }
  1189.                 break;
  1190.             default: break;
  1191.         }
  1192.                 
  1193.         if (ok && theEvent.what == mouseDown)
  1194.             QuickMouseDown(&eve);
  1195.  
  1196.     } while ((hitItem != pOkay) && (hitItem != pCancel));
  1197.     
  1198.     okayed = hitItem == pOkay;
  1199.     
  1200.     if (!okayed)        // change back values
  1201.         memcpy(&gPrefs, &oldprefs, sizeof(prefStruct));
  1202.     else {
  1203.             // inval all game windows
  1204.         Game *game = gGames;
  1205.         while (game) {
  1206.             SetPort((WindowPtr) game->wind);
  1207.             InvalRect(&game->wind->portRect);
  1208.             game = game->next;
  1209.         }
  1210.     }
  1211.     
  1212.     DisposDialog(dialog);        // we Audi 5000, g
  1213. }
  1214.  
  1215.  
  1216. void
  1217. PrefDialog2(void)
  1218. {
  1219.         // items in dialog
  1220.     enum {
  1221.         pOkay = 1,
  1222.         pCancel,
  1223.         pBackgroundDrags,
  1224.         pSoundTells,
  1225.         kFutzer,
  1226.         kNumItems = kFutzer - 1,
  1227.         kNumPieces = 2
  1228.     };
  1229.  
  1230.     Boolean okayed = false;
  1231.     Str255 s;
  1232.     iteminfo ilist[kNumItems+1];
  1233.     short i, hitItem = -1;
  1234.     WindowPtr saveport;
  1235.     long reg, rep;
  1236.     DialogPtr dialog;
  1237.     OSErr err;
  1238.     prefStruct oldprefs = gPrefs;
  1239.         
  1240.     dialog = GetNewDialog(rPrefs2Dialog, nil, (WindowPtr) -1L);
  1241.     verify(dialog);
  1242.     
  1243. //    err = SetDialogDefaultItem(dialog, pOkay);
  1244. //    err = SetDialogCancelItem(dialog, pCancel);
  1245.  
  1246.     ShowWindow(dialog);
  1247.     SetPort(dialog);
  1248.     for (i=1;i<=kNumItems;i++) {
  1249.         ilist[i].item = 0;
  1250.         GetDItem(dialog, i, &ilist[i].itemType, &ilist[i].item, &ilist[i].box);
  1251.         verify(ilist[i].item);
  1252.     }
  1253.  
  1254.     SetCtlValue((ControlHandle) ilist[pBackgroundDrags].item, gPrefs.backgroundOnDrag);
  1255.     SetCtlValue((ControlHandle) ilist[pSoundTells].item, gPrefs.soundTells);
  1256.  
  1257.     int            ok;
  1258.     EventRecord    theEvent, eve;
  1259.     DialogPtr dp;
  1260.     char c;
  1261.  
  1262.     do {
  1263.         ok = GetNextEvent (everyEvent, &theEvent);
  1264.         if (!ok)
  1265.             continue;
  1266.         if (theEvent.what == keyDown)
  1267.             c = (theEvent.message & charCodeMask);
  1268.         eve = theEvent;
  1269.         
  1270.         hitItem = -1;
  1271.         if (theEvent.what == keyDown && ((theEvent.modifiers & cmdKey) != 0)
  1272.             && c == '.')
  1273.             hitItem = pCancel;
  1274.         else if (theEvent.what == keyDown && c == '\r')
  1275.             hitItem = pOkay;
  1276.         else if (IsDialogEvent(&theEvent))
  1277.             if (DialogSelect(&theEvent, &dp, &hitItem)) {
  1278.                 switch (hitItem) {
  1279.                     default: break;
  1280.                 }
  1281.             }
  1282.             
  1283.         switch (hitItem) {
  1284.             case pBackgroundDrags:
  1285.                 gPrefs.backgroundOnDrag = !gPrefs.backgroundOnDrag;
  1286.                 SetCtlValue((ControlHandle) ilist[pBackgroundDrags].item, gPrefs.backgroundOnDrag);
  1287.                 break;
  1288.             case pSoundTells:
  1289.                 gPrefs.soundTells = !gPrefs.soundTells;
  1290.                 SetCtlValue((ControlHandle) ilist[pSoundTells].item, gPrefs.soundTells);
  1291.                 break;
  1292.             default: break;
  1293.         }
  1294.                 
  1295.         if (ok && theEvent.what == mouseDown)
  1296.             QuickMouseDown(&eve);
  1297.  
  1298.     } while ((hitItem != pOkay) && (hitItem != pCancel));
  1299.     
  1300.     okayed = hitItem == pOkay;
  1301.     
  1302.     if (!okayed)        // change back values
  1303.         memcpy(&gPrefs, &oldprefs, sizeof(prefStruct));
  1304.     else {
  1305.             // inval all game windows
  1306.         Game *game = gGames;
  1307.         while (game) {
  1308.             SetPort((WindowPtr) game->wind);
  1309.             InvalRect(&game->wind->portRect);
  1310.             game = game->next;
  1311.         }
  1312.     }
  1313.     
  1314.     DisposDialog(dialog);        // we Audi 5000, g
  1315. }